/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package controlador;

import clases.AlmacenArticulo;
import clases.DetalleMovimiento;
import clases.Kardex;
import clases.Movimiento;
import java.sql.SQLException;
import java.util.ArrayList;
import modelo.Conexion;
import modelo.MdlAlmacenArticulo;
import modelo.MdlDetalleMovimiento;
import modelo.MdlMovimiento;

/**
 *
 * @author Edder
 */
public class CtrlMovimiento implements Controlador<Movimiento> {

    private final Conexion cnx;
    private final MdlMovimiento mdlMovimiento;

    public CtrlMovimiento() {
        this.mdlMovimiento = new MdlMovimiento();
        this.cnx = Conexion.getConexionDefault();
    }

    /**
     *
     * @param movimiento
     * @param cnx
     * @param detalles
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public void insert(Movimiento movimiento, Conexion cnx, DetalleMovimiento... detalles) throws ClassNotFoundException, SQLException {
        MdlAlmacenArticulo mdlAlmArt = new MdlAlmacenArticulo();
        CtrlKardex ctrlKardex = new CtrlKardex();
        Kardex kardex = null;
        if (cnx == null) {
            this.cnx.abrirConexion();
            this.cnx.abrirTransaccion();
            this.insert(movimiento, this.cnx);
            for (DetalleMovimiento detalle : detalles) {
                this.insertDetalle(detalle, this.cnx);
                int idAlmArtOrigen = mdlAlmArt.getId(
                        movimiento.getAlmacenOrigen().getIdAlmacen(),
                        detalle.getArticulo().getIdArticulo(), this.cnx);
                int idAlmArtDestino = mdlAlmArt.getId(
                        movimiento.getAlmacenDestino().getIdAlmacen(),
                        detalle.getArticulo().getIdArticulo(), this.cnx);
                
                if (movimiento.getAlmacenOrigen() != null) {
                    kardex = new Kardex(
                            -1,
                            new AlmacenArticulo(){
                                {
                                    this.setIdAlmacenArticulo(idAlmArtOrigen);
                                }
                            },
                            'E',
                            detalle.getCantidad(),
                            movimiento.getFecha()
                    );
                    ctrlKardex.insert(
                            kardex,
                            this.cnx);
                }
                if (movimiento.getAlmacenDestino() != null) {
                    kardex = new Kardex(
                            -1,
                            new AlmacenArticulo(){
                                {
                                    this.setIdAlmacenArticulo(idAlmArtDestino);
                                }
                            },
                            'I',
                            detalle.getCantidad(),
                            movimiento.getFecha()
                    );
                    ctrlKardex.insert(
                            kardex,
                            this.cnx);
                }
            }
            this.cnx.cerrarTransaccion();
            this.cnx.cerrarConexion();
        } else {
            this.insert(movimiento, cnx);
            for (DetalleMovimiento detalle : detalles) {
                this.insertDetalle(detalle, cnx);
                int idAlmacenArticulo = mdlAlmArt.getId(
                        movimiento.getAlmacenDestino().getIdAlmacen(),
                        detalle.getArticulo().getIdArticulo(), cnx);
                if (movimiento.getAlmacenOrigen() != null) {
                    ctrlKardex.insert(
                            idAlmacenArticulo,
                            'E',
                            detalle.getCantidad(),
                            movimiento.getFecha(),
                            cnx);
                }
                if (movimiento.getAlmacenDestino() != null) {
                    ctrlKardex.insert(
                            idAlmacenArticulo,
                            'I',
                            detalle.getCantidad(),
                            movimiento.getFecha(),
                            cnx);
                }
            }
        }
    }

    /**
     *
     * @param objeto
     * @param cnx
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    @Override
    public void insert(Movimiento objeto, Conexion cnx) throws ClassNotFoundException, SQLException {
        this.mdlMovimiento.insert(objeto, cnx);
        objeto.setIdMovimiento(this.mdlMovimiento.getLastId(cnx));
    }

    /**
     *
     * @param objeto
     * @param cnx
     * @throws SQLException
     */
    public void insertDetalle(DetalleMovimiento objeto, Conexion cnx) throws SQLException {
        MdlDetalleMovimiento mdlDetalleMovimiento = new MdlDetalleMovimiento();
        mdlDetalleMovimiento.insert(objeto, cnx);
        objeto.setIdDetalleMovimiento(mdlDetalleMovimiento.getLastId(cnx));
    }

    /**
     *
     * @param objeto
     * @param cnx
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    @Override
    public void update(Movimiento objeto, Conexion cnx) throws SQLException, ClassNotFoundException {
        if (cnx == null) {
            this.cnx.abrirConexion();
            this.mdlMovimiento.update(objeto, this.cnx);
            this.cnx.cerrarConexion();
        } else {
            this.mdlMovimiento.update(objeto, cnx);
        }
    }

    /**
     *
     * @param id
     * @param cnx
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    @Override
    public Movimiento get(int id, Conexion cnx) throws SQLException, ClassNotFoundException {
        Movimiento movimiento;
        if (cnx == null) {
            this.cnx.abrirConexion();
            movimiento = this.mdlMovimiento.get(id, this.cnx);
            this.cnx.cerrarConexion();
        } else {
            movimiento = this.mdlMovimiento.get(id, cnx);
        }
        return movimiento;
    }

    /**
     *
     * @param idAlmacen
     * @param cnx
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public ArrayList<Movimiento> getMovimientos_almacen(int idAlmacen, Conexion cnx) throws ClassNotFoundException, SQLException {
        ArrayList<Movimiento> movimientos;
        if (cnx == null) {
            this.cnx.abrirConexion();
            movimientos = this.mdlMovimiento.getMovimientos(idAlmacen, this.cnx);
            this.cnx.cerrarConexion();
        } else {
            movimientos = this.mdlMovimiento.getMovimientos(idAlmacen, cnx);
        }
        return movimientos;
    }

    /**
     *
     * @param idAlmacen
     * @param fechaInicio
     * @param fechaFin
     * @param cnx
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public ArrayList<Movimiento> getMovimientos_almacen(int idAlmacen, String fechaInicio, String fechaFin, Conexion cnx) throws ClassNotFoundException, SQLException {
        ArrayList<Movimiento> movimientos;
        if (cnx == null) {
            this.cnx.abrirConexion();
            movimientos = this.mdlMovimiento.getMovimientos(idAlmacen, fechaInicio, fechaFin, this.cnx);
            this.cnx.cerrarConexion();
        } else {
            movimientos = this.mdlMovimiento.getMovimientos(idAlmacen, fechaInicio, fechaFin, cnx);
        }
        return movimientos;
    }

    /**
     *
     * @param idMovimiento
     * @param cnx
     * @return
     * @throws SQLException
     * @throws ClassNotFoundException
     */
    public ArrayList<DetalleMovimiento> getDetalleMovimientos_movimiento(int idMovimiento, Conexion cnx) throws SQLException, ClassNotFoundException {
        MdlDetalleMovimiento mdlDetalleMovimiento = new MdlDetalleMovimiento();
        ArrayList<DetalleMovimiento> detalleMovimientos;
        if (cnx == null) {
            this.cnx.abrirConexion();
            detalleMovimientos = mdlDetalleMovimiento.getDetalleMovimientos_movimiento(idMovimiento, this.cnx);
            this.cnx.cerrarConexion();
        } else {
            detalleMovimientos = mdlDetalleMovimiento.getDetalleMovimientos_movimiento(idMovimiento, this.cnx);
        }
        return detalleMovimientos;
    }
}
